package cn.doitedu;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.BytesWritable;
import org.roaringbitmap.IntConsumer;
import org.roaringbitmap.RoaringBitmap;

import java.util.Arrays;

/**
 * @Author: 深似海
 * @Site: <a href="www.51doit.com">多易教育</a>
 * @QQ: 657270652
 * @Date: 2024/3/28
 * @Desc: 学大数据，上多易教育
 *  对传入的bitmap，求指定日期范围内的连续活跃天数
 **/
public class Bitmap32ContinuousActiveDays extends UDF {

    public int evaluate(BytesWritable bmBytes,int startDiff, int endDiff){
        // 先把表中传入的bitmap字段的字节，反序列化成为bitmap对象
        RoaringBitmap bitmap = Bitmap32SerDeUtil.deSerBitmap(bmBytes.getBytes());

        int rangeLength = endDiff - startDiff + 1;

        // 思想：准备一个指定范围的长度的 全为0的数组
        int[] tmp = new int[rangeLength];

        // 遍历指定范围内的bitmap中的元素，对tmp中相应位置的0改成1，生成一个范围内的010101的字符串
        for(int i = startDiff;i<=endDiff;i++){
            if(bitmap.contains(i)){
                tmp[i-startDiff] = 1;
            }
        }

        // 遍历tmp里面的0/1，拼接字符串 : 0110011101
        StringBuilder sb = new StringBuilder();
        for (int i : tmp) {
            sb.append(i);
        }


        // 然后对上面的 0110011101 字符串，按0切割得到各个1子串
        // 然后找出1子串中的最大长度，就是所要的结果
        int max = 0;
        String[] split = sb.toString().split("0+");
        for (String s : split) {
            if(s.length()>max){
                max = s.length();
            }
        }

        return max;
    }




}
